package com.hsurosy.domain.strategy.model.entity;

import com.hsurosy.domain.strategy.model.valobj.RuleLogicCheckTypeVO;
import lombok.*;

/**
 * @Author Hsu琛君珩
 * @Date 2024-10-17 16:23
 * @Description 规则动作实体
 * @Version: v1.0.0
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RuleActionEntity<T extends RuleActionEntity.RaffleEntity> {

    /** 规则执行的状态码，默认值为 "ALLOW"，表示允许继续后续流程 */
    private String code = RuleLogicCheckTypeVO.ALLOW.getCode();
    /** 规则执行的状态信息，默认值为 "放行"，表示允许执行后续的流程 */
    private String info = RuleLogicCheckTypeVO.ALLOW.getInfo();
    /** 规则模型的名称，表示具体使用的规则逻辑 */
    private String ruleModel;
    /** 具体的规则数据对象，泛型 T 继承自 RaffleEntity，用于承载不同阶段的规则执行结果数据 */
    private T data;

    /**
     * 静态内部类 RaffleEntity，作为规则动作的基类。它被设计为抽象类，子类用于不同的抽奖阶段数据表示
     */
    static public class RaffleEntity {

    }

    /**
     * RaffleBeforeEntity 类，继承自 RaffleEntity，用于表示抽奖开始前的数据
     */
    @EqualsAndHashCode(callSuper = true)
    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    static public class RaffleBeforeEntity extends RaffleEntity {
        /** 策略ID */
        private Long strategyId;
        /** 权重值Key；用于抽奖时可以选择权重抽奖 */
        private String ruleWeightValueKey;
        /** 奖品ID */
        private Integer awardId;
    }

    /**
     * RaffleCenterEntity 类，继承自 RaffleEntity，用于表示抽奖进行中的数据
     */
    static public class RaffleCenterEntity extends RaffleEntity {
    }

    /**
     * RaffleAfterEntity 类，继承自 RaffleEntity，用于表示抽奖完成后的数据
     */
    static public class RaffleAfterEntity extends RaffleEntity {
    }

}
